home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #3 / Amiga Plus CD - 1997 - No. 03.iso / pd / demo-versionen / maxoncpp4-demo / demo / supercode / file.c < prev    next >
C/C++ Source or Header  |  1996-12-31  |  4KB  |  210 lines

  1. //-------------------------------------
  2. //
  3. // SuperCode (c) 1996 by T.Kühn 
  4. //
  5. // Programmiersprache:    ANSI-C
  6. // Projektstart:            12.7.94
  7. //
  8. // Modul:                File.c
  9. //
  10. //-------------------------------------
  11.  
  12. #include <pragma/dos_lib.h>
  13. #include <dos/dos.h>
  14. #include <dos/stdio.h>
  15.  
  16. #include <struct.h>
  17.  
  18.  
  19. char text_buffer[FAULT_MAX+2];
  20.  
  21. //-------------------------------------
  22. ULONG file_error(struct tkfile *file,char *name,ULONG txt,ULONG ask)
  23. {
  24.     ULONG res;
  25.     ULONG error=0;
  26.  
  27.     error=IoErr();
  28.     if (file) file->error=error;
  29.  
  30.     text_buffer[Fault(error,NULL,text_buffer,FAULT_MAX)]=0;
  31.  
  32.     res=display_error((ULONG)txt,ask,name,error,text_buffer);
  33.  
  34.     return res;
  35. }
  36. //-------------------------------------
  37.  
  38.  
  39. //-------------------------------------
  40. struct tkfile *file_open(STRPTR name,LONG accessmode,LONG ask)
  41. {
  42.     struct tkfile *file=(struct tkfile*)Memory_Alloc(sizeof(struct tkfile));
  43.     ULONG res=ASK_YES;
  44.  
  45.     file->name=name;
  46.     file->file=0;
  47.     file->ok=TRUE;
  48.     file->error=0;
  49.  
  50.     if (accessmode==0) accessmode=MODE_OLDFILE;
  51.  
  52.     if (accessmode==MODE_NEWFILE && ask&ASKFILE_OVERWRITE)
  53.     {
  54.         BPTR lock = Lock(name,SHARED_LOCK);
  55.  
  56.         if (lock)
  57.         {
  58.             res=file_error(file,file->name,ERR_OVERWRITE,ASK_YES|ASK_NO);
  59.         }
  60.  
  61.         UnLock(lock);
  62.     }
  63.  
  64.     if (res==ASK_YES)
  65.     {
  66.         while(TRUE)
  67.         {
  68.             file->file = Open(name,accessmode);
  69.             if (file->file) break;
  70.  
  71.             if (ask & ASKFILE_CANTOPEN) break;
  72.  
  73.             res=file_error(file,file->name,ERR_FILEOPEN,ASK_AGAIN|ASK_ABORT);
  74.             if (res==ASK_ABORT) break;
  75.         }
  76.     }
  77.     if (!file->file) file->ok=FALSE;
  78.  
  79.     return file;
  80. }
  81. //-------------------------------------
  82. void file_free(struct tkfile **fileptr)
  83. {
  84.     struct tkfile *file=(*fileptr);
  85.     ULONG res=0;
  86.  
  87.     if (file)
  88.     {
  89.         if (file->file)
  90.         {
  91.             if (DOSFALSE==Close(file->file))
  92.             {
  93.                 res=file_error(file,file->name,ERR_FILECLOSE,ASK_AGAIN|ASK_ABORT);
  94.             }
  95.             file->file=0;
  96.         }
  97.         file->ok=FALSE;
  98.         file->error=0;
  99.     
  100.         Memory_Free((UBYTE**)fileptr);
  101.     }
  102. }
  103. //-------------------------------------
  104. void file_write(struct tkfile *file,APTR buffer,LONG size)
  105. {
  106.     if (file->file && file->ok)
  107.     {
  108.         if (size!=Write(file->file,buffer,size))
  109.         {
  110.             file_error(file,file->name,ERR_FILEWRITE,ASK_AGAIN|ASK_ABORT);
  111.         }
  112.     }
  113. }
  114. //-------------------------------------
  115. void file_writelong(struct tkfile *file,ULONG buf)
  116. {
  117.     if (file->file && file->ok)
  118.     {
  119.         if (4!=Write(file->file,&buf,4))
  120.         {
  121.             file_error(file,file->name,ERR_FILEWRITE,ASK_AGAIN|ASK_ABORT);
  122.         }
  123.     }
  124. }
  125. //-------------------------------------
  126. void file_read(struct tkfile *file,APTR buffer,LONG size)
  127. {
  128.     if (file->ok && buffer)
  129.     {
  130.         if (ENDSTREAMCH==Read(file->file,buffer,size))
  131.         {
  132.             file_error(file,file->name,ERR_FILEREAD,ASK_AGAIN|ASK_ABORT);
  133.         }
  134.     }
  135. }
  136. //-------------------------------------
  137. ULONG file_readlong(struct tkfile *file)
  138. {
  139.     ULONG res=0;
  140.  
  141.     if (file->ok)
  142.     {
  143.         if (ENDSTREAMCH==Read(file->file,&res,4))
  144.         {
  145.             file_error(file,file->name,ERR_FILEREAD,ASK_AGAIN|ASK_ABORT);
  146.         }
  147.     }
  148.     return res;
  149. }
  150. //-------------------------------------
  151.  
  152.  
  153. //-------------------------------------
  154. void file_saveblock(struct tkfile *file,ULONG ind,ULONG ver,ULONG size,APTR block)
  155. {
  156.     file_writelong(file,ind);
  157.     file_writelong(file,ver);
  158.     file_writelong(file,size);
  159.     file_write(file,block,size);
  160. }
  161. //-------------------------------------
  162. void file_loadblock(struct tkfile *file,ULONG ver,ULONG size,APTR block)
  163. {
  164.     ULONG lver=0;
  165.     ULONG lsize=0;
  166.  
  167.     lver=file_readlong(file);
  168.     lsize=file_readlong(file);
  169.  
  170.     if (ver==lver && size==lsize)
  171.     {
  172.         file_read(file,block,lsize);
  173.     }
  174.     else
  175.     {
  176.         file_seek(file,lsize,OFFSET_CURRENT);
  177.     }
  178. }
  179. //-------------------------------------
  180.  
  181.  
  182. //-------------------------------------
  183. LONG file_seek(struct tkfile *file,LONG newpos,LONG offset)
  184. {
  185.     LONG res=0;
  186.  
  187.     if (file->ok)
  188.     {
  189.         res = Seek(file->file,newpos,offset);
  190.     }
  191.     return res;
  192. }
  193. //-------------------------------------
  194.  
  195.  
  196. //-------------------------------------
  197. void file_delete(UBYTE *name)
  198. {
  199.     LONG res;
  200.  
  201.     while(TRUE)
  202.     {
  203.         SetProtection(name,0);
  204.         res=DeleteFile(name);
  205.         if (res!=DOSFALSE) break;
  206.         if (ASK_AGAIN!=file_error(0,name,ERR_FILEDELETE,ASK_AGAIN|ASK_ABORT)) break;
  207.     }
  208. }
  209. //-------------------------------------
  210.